package org.raymond.iworks.study.basic.structure.stack;

import java.util.Scanner;

/**
 * @author raymond
 * @version V1.0
 * @Description: TODO
 */

/**
 * 使用栈完成表达式的计算思路
 * 0. 两个栈,一个存放数值的数据栈,一个存放符号的符号栈
 * 1. 通过index的一个值(索引),来遍历表达式
 * 2. 如果是一个数字,就压入数栈
 * 3. 如果是符号
 * 3.1 如果当前符号栈为空,就直接入栈
 * 3.2 如果符号栈有操作符,就进行比较.
 * 如果当前操作符的优先级<=栈中的操作符,就需要从数栈中pop出两个数,再从符号栈中pop出一个符号,进行运算,
 * 将得到的结果压入数栈,然后将当前操作符压入符号栈
 * 如果当前操作符的优先级>栈中的操作符,就直接入栈
 * 4. 当表达式遍历完,就顺序地从数栈和符号栈中pop出相应的数和符号,并运行.
 * 5. 最后在数栈中只有一个数字,就是表达式的结果.
 *
 * 示例:
 * 1. 3+2*6-2
 * 数栈: ->6->2->3
 * 符号栈: -> - ->*->+
 * -优先级小于*,从数栈中pop初出两个数:6,2,从符号栈中pop出一个符号,*,运算:6*2=12,将结果压入数栈 ->12->3
 * 得到数栈: ->12->3
 * 符号栈: -> - ->+
 * 继续压入 2到数栈 2->12->3
 * 表达式遍历完成,从数栈和符号栈中pop出数据:
 * -2+12+3=13
 */
public class ArrayStackTest {
    public static void main(String[] args) {
        test3();
    }

    public static void test1(){
        ArrayStack stack1 = new ArrayStack(5);
        stack1.push(1);
        stack1.push(2);
        stack1.push(3);
        System.out.println("test push");
        stack1.show();

        stack1.pop();
        System.out.println("test pop");
        stack1.show();
    }

    public static void test2(){
        System.out.println("s(show): 显示栈");
        System.out.println("e(exit): 退出程序");
        System.out.println("i(push): 压入数据");
        System.out.println("p(pop): 弹出数据");

        ArrayStack stack1 = new ArrayStack(5);
        char input = ' ';
        boolean loop = true;
        Scanner scanner = new Scanner(System.in);
        while(loop){
            input = scanner.next().charAt(0);
            switch (input) {
                case 's':
                    stack1.show();
                    break;
                case 'e':
                    scanner.close();
                    loop = false;
                    break;
                case 'i':
                    System.out.println("请输入一个数据");
                    int i = scanner.nextInt();
                    stack1.push(i);
                    break;
                case 'p':
                    try {
                        System.out.println("pop: " + stack1.pop());
                    }catch(Exception e){
                        System.err.println(e.getMessage());
                    }
                    break;
                default:
                    System.out.println("用法不对");
            }
        }
    }

    public static void test3(){
        System.out.println("s(show): 显示栈");
        System.out.println("e(exit): 退出程序");
        System.out.println("i(push): 压入数据");
        System.out.println("p(pop): 弹出数据");

        SingleLinkedListStack stack1 = new SingleLinkedListStack(5);
        char input = ' ';
        boolean loop = true;
        Scanner scanner = new Scanner(System.in);
        while(loop){
            input = scanner.next().charAt(0);
            switch (input) {
                case 's':
                    stack1.show();
                    break;
                case 'e':
                    scanner.close();
                    loop = false;
                    break;
                case 'i':
                    System.out.println("请输入一个数据");
                    int i = scanner.nextInt();
                    stack1.push(i);
                    break;
                case 'p':
                    try {
                        System.out.println("pop: " + stack1.pop());
                    }catch(Exception e){
                        System.err.println(e.getMessage());
                    }
                    break;
                default:
                    System.out.println("用法不对");
            }
        }
    }
}
